package com.yami.shop.common.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.yami.shop.common.bean.AliOss;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * AliOSSUtils
 *
 * @Author Administrator
 * @Date 2025/4/17 9:15
 */
@Component
public class AliOSSUtils {

    @Autowired
    private AliOss aliOss;

    // 限制最大文件大小（例如 10MB）
    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file, String fileName) throws IOException {
        // 获取配置信息
        String endpoint = aliOss.getEndpoint();
        String accessKeyId = aliOss.getAccessKey();
        String accessKeySecret = aliOss.getSecretKey();
        String bucketName = aliOss.getBucketName();

        // 检查文件是否为空
        if (file.isEmpty()) {
            throw new IllegalArgumentException("文件不能为空");
        }

        // 检查文件大小是否超过限制
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new IllegalArgumentException("文件大小超过限制（" + MAX_FILE_SIZE / (1024 * 1024) + "MB）");
        }

        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            // 获取上传的文件的输入流
            InputStream inputStream = file.getInputStream();

            // 避免文件覆盖
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null) {
                throw new IllegalArgumentException("文件名不能为空");
            }
            //String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

            // 上传文件到 OSS
            ossClient.putObject(bucketName, fileName, inputStream);

            // 文件访问路径
            String url = generateFileUrl(fileName);
            return url; // 把上传到oss的路径返回

        } catch (IOException e) {
            throw new IOException("文件上传失败: " + e.getMessage(), e);
        } catch (Exception e) {
            throw new RuntimeException("文件上传过程中发生错误: " + e.getMessage(), e);
        } finally {
            // 关闭 OSS 客户端
            ossClient.shutdown();
        }
    }
    /**
     * 生成文件的访问 URL
     */
    private String generateFileUrl(String fileName) {
        String endpoint = aliOss.getEndpoint();
        String bucketName = aliOss.getBucketName();

        // 如果 endpoint 包含协议（如 http:// 或 https://），则直接使用
        if (endpoint.startsWith("http://") || endpoint.startsWith("https://")) {
            return String.format("%s/%s", endpoint, fileName);
        } else {
            // 如果 endpoint 不包含协议，则默认使用 https
            return String.format("https://%s.%s/%s", bucketName, endpoint, fileName);
        }
    }
}
